#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int g_val1;//未初始化全局变量
int g_val2 = 100;//已初始化全局变量

//int main()
//{
//    pid_t id = fork();
//
//    if(id == 0)
//    {
//        int cnt = 5;
//        //子进程
//        while(1)
//        {
//            printf("i am a child, pid : %d, ppid : %d,g_val : %d, &g_val: %p\n",getpid(),getppid(),g_val,&g_val);
//            sleep(1);
//            if(cnt) cnt--;
//            else{
//                g_val = 200;
//                printf("子进程change_val: 100->200\n");
//            }
//        }
//    }
//    else
//    {
//        //父进程
//        while(1)
//        {
//            printf("i am a parent, pid : %d, ppid : %d,g_val : %d, &g_val: %p\n",getpid(),getppid(),g_val,&g_val);
//            sleep(1);
//        }
//    }
//
//    return 0;
//}



int main(int argc,char *argv[],char* env[])
{
     printf("code addr: %p\n",main);//代码区地址

    const char *str = "hello";
    printf("read only string addr: %p\n",str);//常量区地址

    printf("init global value addr: %p\n",&g_val2);
    printf("uninit global value addr: %p\n",&g_val1);

    char *mem = (char*)malloc(100);
    printf("heap addr: %p\n",mem);

    //int i = 0;
    //printf("stack addr: %p\n",&i);
    printf("stack addr: %p\n",&str);//str是main函数中的临时变量，储存在栈上，str指向的内容是常量字符串，存在常量区i

//环境变量地址
    int i = 0;
    for(i;argv[i];i++)
        printf("argv[%d]: %p\n",i,argv[i]);

    for(i=0;env[i];i++)
        printf("env[%d]: %p\n",i,env[i]);
    return 0;
}
